package mx.ipn.persistencia.mysql;

import java.sql.*;
import java.util.ArrayList;

import mx.ipn.persistencia.dao.ClienteDAO;
import mx.ipn.to.ClienteTO;

public class ClienteDAOMySQL implements ClienteDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ClienteDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO cliente (telefono,nombre,apellido_paterno,apellido_materno) VALUES(?,?,?,?)";
	private static final String DELETE = "DELETE FROM cliente WHERE id_cliente=?";
	private static final String UPDATE = "UPDATE cliente SET telefono=?, nombre=?, apellido_paterno=?, apellido_materno=? WHERE id_cliente=?";

	private static final String FINDBYID = "SELECT * FROM cliente WHERE id_cliente=?";
	private static final String SELECT = "SELECT * FROM cliente";
	private static final String SELECTBYAPELLIDOPATERNO = "SELECT * FROM cliente WHERE apellido_paterno=?";
	private static final String SELECTBYTELEFONO = "SELECT * FROM cliente WHERE telefono=?";
	private static final String SELECTBYNOMBRE = "SELECT * FROM cliente WHERE nombre=?";


	@Override
	public boolean insertCliente(ClienteTO clienteTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, clienteTO.getTelefono());
			ps.setString(2, clienteTO.getNombre());
			ps.setString(3, clienteTO.getApellidoPaterno());
			ps.setString(4, clienteTO.getApellidoMaterno());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public short deleteCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idCliente);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public short updateCliente(ClienteTO clienteTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, clienteTO.getTelefono());
			ps.setString(2, clienteTO.getNombre());
			ps.setString(3, clienteTO.getApellidoPaterno());
			ps.setString(4, clienteTO.getApellidoMaterno());
			ps.setInt(5, clienteTO.getIdCliente());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ClienteTO findClienteById(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				idCliente = rs.getInt("id_cliente");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");

				ClienteTO clienteTO = new ClienteTO(idCliente, telefono,
						nombre, apellidoPaterno, apellidoMaterno);

				ps.close();
				conexion.close();
				return clienteTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteTO> selectClientes() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<ClienteTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ClienteTO>();

				int idCliente = rs.getInt("id_cliente");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");

				ClienteTO clienteTO = new ClienteTO(idCliente, telefono,
						nombre, apellidoPaterno, apellidoMaterno);

				coleccion.add(clienteTO);
			}

			ps.close();
			conexion.close();
			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteTO> selectClientesByApellidoPaterno(
			String apellidoPaterno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYAPELLIDOPATERNO);

			ps.setString(1, apellidoPaterno);

			ResultSet rs = ps.executeQuery();

			ArrayList<ClienteTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ClienteTO>();

				int idCliente = rs.getInt("id_cliente");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");

				ClienteTO clienteTO = new ClienteTO(idCliente, telefono,
						nombre, apellidoPaterno, apellidoMaterno);

				coleccion.add(clienteTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<ClienteTO> selectClientesByTelefono(String telefono) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYTELEFONO);

			ps.setString(1, telefono);

			ResultSet rs = ps.executeQuery();

			ArrayList<ClienteTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ClienteTO>();

				int idCliente = rs.getInt("id_cliente");
				telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");

				ClienteTO clienteTO = new ClienteTO(idCliente, telefono,
						nombre, apellidoPaterno, apellidoMaterno);

				coleccion.add(clienteTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<ClienteTO> selectClientesByNombre(String nombre) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYNOMBRE);

			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();

			ArrayList<ClienteTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<ClienteTO>();

				int idCliente = rs.getInt("id_cliente");
				String telefono = rs.getString("telefono");
				String nom = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");

				ClienteTO clienteTO = new ClienteTO(idCliente, telefono, nom,
						apellidoPaterno, apellidoMaterno);

				coleccion.add(clienteTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	
}
